{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# tensorflow2文本卷积"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.基本文本卷积\n",
    "- For more information, refer to:\n",
    "    - Kim 2014 (http://emnlp2014.org/papers/pdf/EMNLP2014181.pdf)\n",
    "    - Zhang et al 2015 (https://papers.nips.cc/paper/5782-character-level-convolutional-networks-for-text-classification.pdf)\n",
    "    \n",
    "<br>\n",
    "- 使用卷积进行句子分类(Kim 2014)\n",
    "</br>\n",
    "<img src=\"http://d3kbpzbmcynnmx.cloudfront.net/wp-content/uploads/2015/11/Screen-Shot-2015-11-06-at-8.03.47-AM.png\" style=\"width: 800px\"/>\n",
    "\n",
    "<br>\n",
    "- 多个卷积核\n",
    "\n",
    "<img src=\"http://d3kbpzbmcynnmx.cloudfront.net/wp-content/uploads/2015/11/Screen-Shot-2015-11-06-at-12.05.40-PM.png\" style=\"width: 600px\"/>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "from tensorflow.keras.preprocessing.sequence import pad_sequences"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_features = 3000\n",
    "sequence_length = 300\n",
    "embedding_dimension = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(25000,)\n",
      "(25000,)\n",
      "(25000,)\n",
      "(25000,)\n"
     ]
    }
   ],
   "source": [
    "(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=num_features)\n",
    "print(x_train.shape)\n",
    "print(x_test.shape)\n",
    "print(y_train.shape)\n",
    "print(y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(25000, 300)\n",
      "(25000, 300)\n",
      "(25000,)\n",
      "(25000,)\n"
     ]
    }
   ],
   "source": [
    "x_train = pad_sequences(x_train, maxlen=sequence_length)\n",
    "x_test = pad_sequences(x_test, maxlen=sequence_length)\n",
    "print(x_train.shape)\n",
    "print(x_test.shape)\n",
    "print(y_train.shape)\n",
    "print(y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.构造基本句子分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def imdb_cnn():\n",
    "    model = keras.Sequential([\n",
    "        layers.Embedding(input_dim=num_features, output_dim=embedding_dimension,input_length=sequence_length),\n",
    "        layers.Conv1D(filters=50, kernel_size=5, strides=1, padding='valid'),\n",
    "        layers.MaxPool1D(2, padding='valid'),\n",
    "        layers.Flatten(),\n",
    "        layers.Dense(10, activation='relu'),\n",
    "        layers.Dense(1, activation='sigmoid')\n",
    "    ])\n",
    "    model.compile(optimizer=keras.optimizers.Adam(1e-3),\n",
    "                 loss=keras.losses.BinaryCrossentropy(),\n",
    "                 metrics=['accuracy'])\n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_3\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_3 (Embedding)      (None, 300, 100)          300000    \n",
      "_________________________________________________________________\n",
      "conv1d_3 (Conv1D)            (None, 296, 50)           25050     \n",
      "_________________________________________________________________\n",
      "max_pooling1d_3 (MaxPooling1 (None, 148, 50)           0         \n",
      "_________________________________________________________________\n",
      "flatten_3 (Flatten)          (None, 7400)              0         \n",
      "_________________________________________________________________\n",
      "dense_6 (Dense)              (None, 10)                74010     \n",
      "_________________________________________________________________\n",
      "dense_7 (Dense)              (None, 1)                 11        \n",
      "=================================================================\n",
      "Total params: 399,071\n",
      "Trainable params: 399,071\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = imdb_cnn()\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 22500 samples, validate on 2500 samples\n",
      "Epoch 1/5\n",
      "22500/22500 [==============================] - 23s 1ms/sample - loss: 0.4255 - accuracy: 0.7789 - val_loss: 0.3002 - val_accuracy: 0.8732\n",
      "Epoch 2/5\n",
      "22500/22500 [==============================] - 22s 960us/sample - loss: 0.2367 - accuracy: 0.9060 - val_loss: 0.2985 - val_accuracy: 0.8752\n",
      "Epoch 3/5\n",
      "22500/22500 [==============================] - 23s 1ms/sample - loss: 0.1171 - accuracy: 0.9603 - val_loss: 0.3549 - val_accuracy: 0.8680\n",
      "Epoch 4/5\n",
      "22500/22500 [==============================] - 22s 969us/sample - loss: 0.0286 - accuracy: 0.9937 - val_loss: 0.4745 - val_accuracy: 0.8656\n",
      "Epoch 5/5\n",
      "22500/22500 [==============================] - 22s 964us/sample - loss: 0.0047 - accuracy: 0.9996 - val_loss: 0.5525 - val_accuracy: 0.8684\n",
      "CPU times: user 4min 33s, sys: 4.77 s, total: 4min 38s\n",
      "Wall time: 1min 50s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD8CAYAAACb4nSYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VPW5x/HPkz2BQELCnkBAEQFBloCodalbEVRUVMC6UFtttdbaW1vRa8WlVW/rvW1ttdatVasiglq0tIgVXIoKQdn3NQlBCIGEQPbkd/+YAYaYkAlMMjOZ7/v1mlfOnPM7Z545MM/5zXN+54w55xARkcgQFewARESk9Sjpi4hEECV9EZEIoqQvIhJBlPRFRCKIkr6ISARR0hcRiSBK+iIiEURJX0QkgsQEO4D60tPTXVZWVrDDEBEJK0uWLNntnOvcVLuQS/pZWVnk5OQEOwwRkbBiZtv8aafyjohIBFHSFxGJIEr6IiIRJORq+g2prq4mPz+fioqKYIcSVhISEsjIyCA2NjbYoYhIiGgy6ZvZC8AlwC7n3CkNLDfg98BYoAyY4pz7wrvsRuA+b9NfOudePJYg8/PzSU5OJisrC8/LSVOccxQVFZGfn0+fPn2CHY6IhAh/yjt/BcYcZfnFQD/v4xbgTwBm1gmYBpwGjAKmmVnqsQRZUVFBWlqaEn4zmBlpaWn6diQiR2gy6TvnPgL2HKXJeOAl5/EZkGJm3YFvAfOcc3ucc3uBeRz94HFUSvjNp30mIvUFoqbfE8jzeZ7vndfYfBGRiOScY39lDcVl1ZSUex7FZdUUl1dRXFZNalIc157Wq0VjCIkTuWZ2C57SEL16tewbPlbFxcW8+uqr3Hbbbc1ab+zYsbz66qukpKQ02ub+++/n7LPP5oILLjjeMEWkFdTU1nkStjdxl/gk7iMTepWnjXdecXk1tXWN/y75sF4pYZH0twOZPs8zvPO2A+fWm7+goQ04554BngHIzs4OyV9qLy4u5qmnnvpa0q+pqSEmpvHdOGfOnCa3/dBDDx13fCLSPM45KqoPJm/fhF3l0wM/nNAPzispq6a0suao205OiCElKZaUxDhSkmLpkZJISmLsoXkdk2LpmBjrnedp0zExloTY6BZ/34FI+rOB281sOp6TtiXOuR1mNhd4xOfk7UXAPQF4vaCYOnUqmzZtYujQocTGxpKQkEBqaipr165l/fr1XH755eTl5VFRUcGPf/xjbrnlFuDwbSX279/PxRdfzDe+8Q0WLlxIz549+fvf/05iYiJTpkzhkksu4aqrriIrK4sbb7yRd955h+rqat544w1OPvlkCgsLufbaaykoKOD0009n3rx5LFmyhPT09CDvGZHgqqtzlFbWHNnbPtQDP/y8uKyafeVHtqmqqWt0uzFRdigZpyTF0SU5gZO6JNPRJ5l3TIz1Pvcm78RYkhNiiIkO3Uug/Bmy+RqeHnu6meXjGZETC+CcexqYg2e45kY8Qza/4122x8weBhZ7N/WQc+5oJ4T98uA7q1hdsO94N3OEgT06MO3SQUdt89hjj7Fy5UqWLl3KggULGDduHCtXrjw0HPKFF16gU6dOlJeXM3LkSCZMmEBaWtoR29iwYQOvvfYazz77LNdccw2zZs3iuuuu+9prpaen88UXX/DUU0/x+OOP89xzz/Hggw9y3nnncc899/Cvf/2L559/PnA7QCQEVNXUecsiR5ZJig8m7/KG5+0rr+YoFROS4qJJSYylY1IcHRNj6Jve3pOwD/a6D/XAvfOSPPPaxUW3ycEQTSZ959zkJpY74IeNLHsBeOHYQgtto0aNOmL8+xNPPMFbb70FQF5eHhs2bPha0u/Tpw9Dhw4FYMSIEWzdurXBbV955ZWH2rz55psAfPLJJ4e2P2bMGFJTj2n0q0ir2bWvgo2F+7098MMnLPcdnC47MnmXVdU2ui0zPL3qxNhDCbx3p6RDybqDT087Jcnz6OBtHx/T8iWTcBISJ3Kbo6keeWtp167doekFCxbw/vvv8+mnn5KUlMS5557b4Pj4+Pj4Q9PR0dGUl5c3uO2D7aKjo6mpOXrtUCSUVNfW8cHaXUxflMuH6wu/1gOPi47yKYfE0jMlkUE9OvjUtz0JPeVggvf2xpMTYoiKanu97mAIu6QfLMnJyZSWlja4rKSkhNTUVJKSkli7di2fffZZwF//zDPPZMaMGdx9992899577N27N+CvIXKsthUd4PXFebyxJJ/C0kq6dojntnNP5IwT00j1nqhMSYwjITaqTZZMwomSvp/S0tI488wzOeWUU0hMTKRr166Hlo0ZM4ann36aAQMG0L9/f0aPHh3w1582bRqTJ0/m5Zdf5vTTT6dbt24kJycH/HVE/FVZU8vcVTuZviiXhZuKiDI47+QuTBrZi3P7dw7pk5mRzDwl+dCRnZ3t6v+Iypo1axgwYECQIgoNlZWVREdHExMTw6effsqtt97K0qVLm1xP+04CbcPOUl5blMebX+ZTXFZNRmoiE7MzuTo7k24dE4IdXsQysyXOueym2qmnHyZyc3O55pprqKurIy4ujmeffTbYIUkEKauq4d3lO3h9cR5Ltu0lNtq4aGA3Jo3K5MwT0lVvDyNK+mGiX79+fPnll8EOQyLMivwSpi/OZfbSAkora+jbuR3/PXYAVw7vSVr7+KY3ICFHSV9EjrCvopq/Ly1g+qJcVhXsIz4minFDujN5VC+ye6fqRGyYU9IXEZxzLNm2l9cW5fGPFQVUVNcxsHsHHh4/iMuG9qRjon6Ip61Q0heJYHsOVPHmF/lMX5zHxl37aRcXzRXDMpg8KpPBPTuqV98GKemLRJi6Osenm4t4bVEu763aSVVtHcN6pfDrCUMYN6Q77eKVFtoy/eu2kPbt27N//34KCgq44447mDlzZqNtt27dysKFC7n22msByMnJ4aWXXuKJJ55orXAlAuzaV8EbS/J5fXEeuXvK6JgYy7dH92LSyF7076ZrPiKFkn4L69Gjx1ETPniS/quvvnoo6WdnZ5Od3eRwW5Em1dTW8eH6Ql5blMf8dbuorXOc3jeNn150Et8a1K1VbuUroUVJ309Tp04lMzOTH/7Qc2+5Bx54gJiYGObPn8/evXuprq7ml7/8JePHjz9iva1bt3LJJZewcuVKtm7dyvXXX8+BAwcA+OMf/8gZZ5zB1KlTWbNmDUOHDuXGG29k2LBhPP7447z77rvs2bOHm266ic2bN5OUlMQzzzzDkCFDeOCBB8jNzWXz5s3k5uZy5513cscdd7T6fpHQlLenjBk5ebyRk89X+ypIbx/PzWf1ZeLITPqkt2t6A9JmhV/S/+dU+GpFYLfZbTBc/NhRm0ycOJE777zzUNKfMWMGc+fO5Y477qBDhw7s3r2b0aNHc9lllzV68qtLly7MmzePhIQENmzYwOTJk8nJyeGxxx47lOTBcwO3g6ZNm8awYcN4++23+eCDD7jhhhsOXYm7du1a5s+fT2lpKf379+fWW28lNlajLCJVVU0d81bvZPriXD7ZuBuAc07qzAOXDeL8AV2I1W0RhHBM+kEybNgwdu3aRUFBAYWFhaSmptKtWzd+8pOf8NFHHxEVFcX27dvZuXMn3bp1a3Ab1dXV3H777SxdupTo6GjWr1/f5Ot+8sknzJo1C4DzzjuPoqIi9u3z/J7AuHHjiI+PJz4+ni5durBz504yMjIC96YlLGwq3M/ri/OYtSSfogNV9OiYwI/P78fV2Zn0TEkMdngSYsIv6TfRI29JV199NTNnzuSrr75i4sSJvPLKKxQWFrJkyRJiY2PJyspq8JbKB/32t7+la9euLFu2jLq6OhISju8+JfVv1azbMEeOiupa5qzYwfRFeSzauoeYKOOCAV2ZOCqTs/t1Jlq3RZBGhF/SD6KJEydy8803s3v3bj788ENmzJhBly5diI2NZf78+Wzbtu2o65eUlJCRkUFUVBQvvvgitbWeH4042m2bzzrrLF555RV+8YtfsGDBAtLT0+nQoUPA35uEh9UF+5i+OJe3vtxOaUUNWWlJ3D3mZCaM6EmXZN3sTJqmpN8MgwYNorS0lJ49e9K9e3e+/e1vc+mllzJ48GCys7M5+eSTj7r+bbfdxoQJE3jppZcYM2bMoR9iGTJkCNHR0Zx66qlMmTKFYcOGHVrngQce4KabbmLIkCEkJSXx4osvtuh7lNCzv7KG2UsLeH1xLsvyS4iLieLiU7oxaWQvRvftpAuopFl0a+U2TvsuPDnnWJpXzPRFebyzvICyqlr6d01m0qhMrhjWk5SkuGCHKCFGt1YWCUPFZVW89eV2Xl+cx9qvSkmKi+bSIT2YOCqTYZkp6tXLcVPSFwky5xyfbd7D64tzmbPyK6pq6jg1oyOPXDGYS0/tTnKChuFK4IRN0nfOqZfTTKFWupMjFZZWMusLz20Rtuw+QHJCDJNGZjJpZC8G9tDJemkZYZH0ExISKCoqIi0tTYnfT845ioqKjntYqARWbZ3j4w2FTF+Ux/trdlJT5xiV1YkfnXciYwd3120RpMWFRdLPyMggPz+fwsLCYIcSVhISEnSxVogoKC4/dFuE7cXldGoXx03f6MM12Zmc2KV9sMOTCBIWST82NpY+ffoEOwyRZqmurePfa3bx+uJcPlxfiAO+cWI6944dwIUDuxIXo9siSOsLi6QvEk627j7A6zl5zFyST2FpJV07xPPDb57INdmZZHZKCnZ4EuGU9EUCoKK6lrmrvmL6ojw+3VxEdJTxzf5dmDwqk3NO6kyMbnYmIUJJX+Q4rN9ZymuLPLdFKC6rJrNTIj/7Vn+uGpFB1w46iS6hR0lfpJnKqmp4d9kOpi/O5YvcYmKjjW8N8twW4YwT0ojSzc4khCnpi/hpzY59vPzZNmYvLWB/ZQ0ndG7HfeMGcOXwDDq1020RJDwo6Ys04UBlDf/73nr+snAL8TFRjBvcg8mjMhnRO1XXjUjYUdIXOYr563Zx31srKSgp57rTenPXRf3pmKTbIkj4UtIXaUDR/koefnc1by8t4MQu7Xnj+6eTndUp2GGJHDclfREfzjne+nI7D7+7mv2VNfz4/H7c9s0TiI/R7RGkbVDSF/HK21PGvW+t4OMNuxneK4XHJgzhpK7JwQ5LJKCU9CXi1dTW8deFW/nf99YTZfDw+EF8+7TeGnopbZJfSd/MxgC/B6KB55xzj9Vb3ht4AegM7AGuc87le5fVAiu8TXOdc5cFKHaR47a6YB9T31zO8vwSLhjQhYfGn0KPlMRghyXSYppM+mYWDTwJXAjkA4vNbLZzbrVPs8eBl5xzL5rZecCjwPXeZeXOuaEBjlvkuFRU1/L7f2/gmY82k5oUy5PXDmfs4G4agiltnj89/VHARufcZgAzmw6MB3yT/kDgv7zT84G3AxmkSCAt3LSbe99cwdaiMq7JzuDesQP0m7MSMfy5C1RPIM/neb53nq9lwJXe6SuAZDNL8z5PMLMcM/vMzC4/rmhFjkNJWTV3z1zOtc9+jgNe/d5p/PqqU5XwJaIE6kTuXcAfzWwK8BGwHaj1LuvtnNtuZn2BD8xshXNuk+/KZnYLcAtAr169AhSSiIdzjjkrvmLa7FXsLaviB+ecwJ0X9NOvVElE8ifpbwcyfZ5neOcd4pwrwNvTN7P2wATnXLF32Xbv381mtgAYBmyqt/4zwDMA2dnZ+mFXCZgdJeX84u1VvL9mJ4N7duTFm0YyqEfHYIclEjT+JP3FQD8z64Mn2U8CrvVtYGbpwB7nXB1wD56RPJhZKlDmnKv0tjkT+HUA4xdpUF2d45XPt/E//1pHTV0d/z12AN85M0v3tZeI12TSd87VmNntwFw8QzZfcM6tMrOHgBzn3GzgXOBRM3N4yjs/9K4+APizmdXhOX/wWL1RPyIBt2FnKVPfXMGSbXs5q186v7p8ML3S9ItVIgDmXGhVU7Kzs11OTk6ww5AwVFlTy58WbOLJ+RtpFx/DL8YN5MrhPTUMUyKCmS1xzmU31U5X5EqbsGTbHqbOWsGGXfsZP7QHv7hkIOnt44MdlkjIUdKXsFZaUc1v5q7j5c+20aNjIn/5zki+2b9LsMMSCVlK+hK23l+9k/veXsnO0gqmnJHFXRf1p128/kuLHI0+IRJ2dpVW8OA7q/nH8h3075rMn64bzrBeqcEOSyQsKOlL2HDO8UZOPr/8x2oqquu466KTuOXsE4iL0TBMEX8p6UtY2Lr7APe+tYKFm4oY1acTj145mBM6tw92WCJhR0lfQlp1bR3PfbyF372/nrjoKB65YjCTRmbqXvcix0hJX0LWivwS7p61nNU79jFmUDceHD+Irh0Sgh2WSFhT0peQU1ZVw2/nref5T7aQ3j6ep68bzphTugc7LJE2QUlfQsrHGwq5960V5O0p59rTenH3mJPpmBgb7LBE2gwlfQkJew9U8fA/VvPmF9vpm96O128ZzWl905peUUSaRUlfgso5x+xlBTz0zmpKyqv50Xkn8sNvnqh73Yu0ECV9CZr8vWXc9/ZKFqwrZGhmCq9MGMzJ3ToEOyyRNk1JX1pdbZ3jxYVbefy9dQBMu3QgN5yeRbSGYYq0OCV9aVVrv9rH3bNWsCyvmHP7d+aXl59CRqrudS/SWpT0pVVUVNfyxw828vSHm+iQGMvvJw3lslN76F73Iq1MSV9a3Oebi7jnzRVs3n2AK4f35L5xA+nULi7YYYlEJCV9aTEl5dU89s+1vLYol8xOibz83VGc1a9zsMMSiWhK+tIi/rVyB/f/fRW791dy81l9+MmFJ5EUp/9uIsGmT6EE1M59Fdz/95XMXbWTgd078PyNIxmc0THYYYmIl5K+BERdnWP64jwenbOGqto67h5zMt87qw+x0brXvUgoUdKX47apcD/3zFrBoq17OL1vGo9eOZis9HbBDktEGqCkL8esqqaOZz7axBP/3khCbBS/njCEq7MzNAxTJIQp6csx+TJ3L1NnrWDdzlLGDenOtEsH0iVZ97oXCXVK+tIsBypr+M3cdbz46Va6dUjguRuyuWBg12CHJSJ+UtIXv81fu4v73l5JQUk514/uzc++1Z/kBN3rXiScKOlLk3bvr+Shd1Yze1kBJ3Zpz8wfnM6I3p2CHZaIHAMlfWmUc45ZX2znl/9YzYHKGu68oB+3nnsC8TG6171IuFLSlwblFpVx71sr+GTjbkb0TuWxKwfTr2tysMMSkeOkpC9HqKmt44X/bOH/5q0nJiqKh8cP4tun9SZK97oXaROU9OWQldtLmPrmclZu38cFA7rw8OWn0L1jYrDDEpEAUtIXyqtq+d2/1/Pcx1tITYrjyWuHM3ZwN11kJdIGKelHuIUbd3PPWyvYVlTGxOxM7h07gI5JGoYp0lYp6Uco5xz3vb2SVz7PJSstiVdvPo0zTkgPdlgi0sKU9CPUK5/n8srnuUw5I4upF59MQqyGYYpEAiX9CJS3p4xH56zhGyemM+3Sgardi0QQv252bmZjzGydmW00s6kNLO9tZv82s+VmtsDMMnyW3WhmG7yPGwMZvDRfXZ3j7lnLMTMemzBYCV8kwjSZ9M0sGngSuBgYCEw2s4H1mj0OvOScGwI8BDzqXbcTMA04DRgFTDOz1MCFL831yqJcFm4q4t6xA8hITQp2OCLSyvzp6Y8CNjrnNjvnqoDpwPh6bQYCH3in5/ss/xYwzzm3xzm3F5gHjDn+sOVYHCzrnNUvncmjMoMdjogEgT9JvyeQ5/M83zvP1zLgSu/0FUCymaX5uS5mdouZ5ZhZTmFhob+xSzPU1Tl+PnM5UWY8NmGIyjoiESpQP2B6F3COmX0JnANsB2r9Xdk594xzLts5l925c+cAhSS+/vb5Nj7dXMR94wbQM0VX2YpEKn9G72wHfGsBGd55hzjnCvD29M2sPTDBOVdsZtuBc+utu+A44pVjkFtUxqNz1nL2SZ2ZOFJlHZFI5k9PfzHQz8z6mFkcMAmY7dvAzNLN7OC27gFe8E7PBS4ys1TvCdyLvPOkldTVOX42cxkxUcZjV2q0jkikazLpO+dqgNvxJOs1wAzn3Coze8jMLvM2OxdYZ2brga7Ar7zr7gEexnPgWAw85J0nreTlz7bx+ZY93HfJAHqorCMS8cw5F+wYjpCdne1ycnKCHUabsK3oAGN+9zGj+nTir98ZqV6+SBtmZkucc9lNtQvUiVwJMZ6yznJionURlogcpqTfRr346VYWbdnDLy4ZqHvii8ghSvpt0NbdB/iff63lm/07c/WIjKZXEJGIoaTfxhy8CCs2OopHr9RFWCJyJCX9NuavC7eyaOse7r9kIN06JgQ7HBEJMUr6bciW3Qf49dy1nHdyF65SWUdEGqCk30bU1jl+9sYy4qKjeOQKjdYRkYYp6bcRf/nPFnK27WXapYNU1hGRRinptwGbC/fzm7nrOP/kLlw5/Gs3MRUROURJP8zVei/Cio+J4hHdW0dEmqDfyA1zf/nPFpZs28v/XXMqXTuorCMiR6eefhjb5C3rXDCgC1cMU1lHRJqmpB+mDo7WSYiN1mgdEfGbyjth6vlPNvNFbjG/mziULirriIif1NMPQxt37efx99Zz4cCujB/aI9jhiEgYUU8/zNR6fwkrKS6aX11xSvPKOs5BXS3UVnkf1RDfHmJ1F06RSKGkHwh1dVBXfTiR+ibVQEzXHJ63eUcR392xhxE929Hl788cZb1GtkUDP5oT1x6S0qBdZ+8j3fvwPvddlpQGMXGtvotFJDDaTtKvqYRN85tIoEdLsJXNaFtvuq6mZd5TVAxEx0F0LETHUU0McfvrGJ4QTzfXAcriDi+P7XhEW7+mo2KgqhQO7IYDhZ6/JflQ8CWU7W78fSV0bPiA8LWDRTokdYKo6JbZPyLSbG0n6VeWwmsT/WsbHX+UpOgzLyYB4jtATHzDy1tyOioWog6fcqmpreOqpz8lt/wA791xDpYc30I70ss5qCj2HhAOHhS8B4Yyn4NE0SbI/QzKimjwWwTmPTCkHz4wJPlM1/+bkAIaiSTSYtpO0k9IgZvnN51Uo6LDMqk8+/EWluUV88TkYXRu6YQPnn2UmOp5pPdrun1dLZTvPfLg4HuwKPM+/2qF529FccPbiYqpd1Bo6GDRGdp5v2HEtQ/Lf0+RYGk7ST86BnoOD3YULWLDzlJ+O289YwZ149Ih3YMdTsOiog8naQY03b6myvPtwPdbQ0PfKPZu8UxX7W94OzEJDZSZfKd9l6XrpLVEvLaT9Nuomto67npjGe3io3n48maO1gllMXHQobvn4Y/q8sMHhbKihr9RlO2GwrWe6ZqKhrcT1/7wt4ekeucgfL9ZHFwWHRu49yxyNAdH10W3bFpW0g9xz3y8mWX5Jfyhtco6oSo2EVIyPY+mOOf5ZlD/gFD/IFGSDzuWeqYbPWmdcmSJKS7Zc8CKjvf5m3DkvJgE7zmheO8876OpeVG6bCYkOOcZGFJT7v1bAdUVnr8HH40+91mvuryR50fZTs9s+N68Fn17SvohbP3OUn43bwMXn9KNS0K1rBOKzCA+2fPo1Kfp9odOWvt+g2jgG8XujVB1wDPSq8b7qK0EVxeYuKNifQ4ECcd/cPGd3+g83236LG/h3qZf6moPJ9Lq8sAk1frPG9pOY98S/RUV6+mkxBz8N/M+Yr1/k9IOL4tNOLJNau/A7LujCIF/WWnIwbJO+4SYtlXWCUVHnLQ+sfnr19Z8/UBQU+VJHrVVTcw7uE5VvfUPzqvwXqfhXb+yFGoKj5znu8266gDtk6h6B5f4Bg4OfhxccE0n58Z6ycf7XmISvLF4E3D9RJyQ8vWke+h5Q+s1sp2YhCPnhfgQZSX9EPXnjzazPL+EJ68dTnr7CC7rhIPoGM8jrl2wI/FcKFjbnANJIweXmorD0w0enLyJuqKk4fVrD/aYzZsQ6ydV7yM+2VM6a3aS9SNZq6PUICX9ELTuq1J+9/56xg3uzjiVdaQ5oqIgKjE0Rik573UbSr4hRUk/xFR7yzodEmJ5aPygYIcjcuyU7EOSkn6I+fOHm1ixvYSnvj2cNJV1RCTANEYshKz9ah+///cGxg3pztjBKuuISOAp6YeI6to6fjpjGR0TY3l4/CnBDkdE2iiVd0LEnxZsYlXBPp6+bjid2unWxSLSMtTTDwFrduzjDx9s4NJTezDmFJV1RKTlKOkH2cHROh0TY3nwMo3WEZGWpfJOkD01/2BZZ4TKOiLS4tTTD6JVBSX84YMNXHZqD8ac0i3Y4YhIBPAr6ZvZGDNbZ2YbzWxqA8t7mdl8M/vSzJab2Vjv/CwzKzezpd7H04F+A+GqqqaOu95YTkpSnMo6ItJqmizvmFk08CRwIZAPLDaz2c651T7N7gNmOOf+ZGYDgTlAlnfZJufc0MCGHf6enL+RNTv28cz1I0hVWUdEWok/Pf1RwEbn3GbnXBUwHRhfr40DOninOwIFgQux7VlVUMKT8zdy+dAeXDRIZR0RaT3+JP2eQJ7P83zvPF8PANeZWT6eXv6PfJb18ZZ9PjSzsxp6ATO7xcxyzCynsLDQ/+jDUFWN5yKs1HZxPKCyjoi0skCdyJ0M/NU5lwGMBV42syhgB9DLOTcM+C/gVTPrUH9l59wzzrls51x2586dAxRSaPrj/I2s/aqUR64YTEqSyjoi0rr8SfrbAd/fqMvwzvP1XWAGgHPuUyABSHfOVTrnirzzlwCbgJOON+hwtXJ7CU/N38gVw3py4cCuwQ5HRCKQP0l/MdDPzPqYWRwwCZhdr00ucD6AmQ3Ak/QLzayz90QwZtYX6AdsDlTw4cQzWmcZndrFMe3SgcEOR0QiVJOjd5xzNWZ2OzAXiAZecM6tMrOHgBzn3Gzgp8CzZvYTPCd1pzjnnJmdDTxkZtVAHfAD59yeFns3IewPH2xg7VelPH9jtso6IhI0fl2R65ybg+cEre+8+32mVwNnNrDeLGDWccYY9lbkl/DUgk1cObwn5w9QWUdEgkdX5Lawyppa7npjGent45h2iUbriEhw6d47LewP/97Iup2lvDAlm45JscEOR0QinHr6LWh5fjF/+nATE4ZncN7JKuuISPAp6bcQ37LO/RqtIyIhQuWdFvL79zewfud+/vKdkXRMVFlHREKDevotYFleMU9/uIktG8eYAAAKSklEQVSrR2Twzf5dgh2OiMghSvoBVlHtKet0SU7gvktU1hGR0KLyToD9/t8b2LBLZR0RCU3q6QfQ0rxi/vzhJq7JVllHREKTkn6AVFTX8tMZS+naQWUdEQldKu8EyG/fX8+mwgO8eNMoOiSorCMioUk9/QD4Incvz360mUkjMznnpLb9ewAiEt6U9I9TRXUtP3tjGd06JPDf4wYEOxwRkaNSeec4/Xaep6zz0k2jSFZZR0RCnHr6x2HJtr08+/FmJo/K5GyVdUQkDCjpH6ODZZ3uHRO5d6zKOiISHlTeOUb/+946Nu8+wN++e5rKOiISNtTTPwZLtu3huU+2cO1pvfhGv/RghyMi4jcl/WbylHWW00NlHREJQyrvNNPjcz1lnVe+dxrt47X7RCS8qKffDDlb9/D8f7bw7dN6ceaJKuuISPhR0vdTeZXnlsk9UxK5R2UdEQlTqk/46Tdz17G1qIxXb1ZZR0TCl3r6fli0ZQ9/WbiF60f35owTVNYRkfClpN+E8qpafj5zGRmpiUy9+ORghyMiclxUp2jCr+euZWtRGa/dPJp2KuuISJhTT/8oPt9cxF8XbuWG03tz+glpwQ5HROS4Kek3oqyqhp/NXE5mahJ3j1FZR0TaBtUrGvHrf60jd08Z029RWUdE2g719BvwmbesM+WMLEb3VVlHRNoOJf16yqpq+PnM5fROS+LnY/oHOxwRkYBS3aKe//nnWnL3lPH6LaNJitPuEZG2RT19H59uKuLFT7cx5YwsTlNZR0TaICV9rwOVNfxs5jKyVNYRkTZM9Quvx/65lu3F5cz4/ukq64hIm+VXT9/MxpjZOjPbaGZTG1jey8zmm9mXZrbczMb6LLvHu946M/tWIIMPlIUbd/PyZ9v4zhl9GJnVKdjhiIi0mCa7tGYWDTwJXAjkA4vNbLZzbrVPs/uAGc65P5nZQGAOkOWdngQMAnoA75vZSc652kC/kWN1oLKGn89aTp/0dvzsWyrriEjb5k9PfxSw0Tm32TlXBUwHxtdr44AO3umOQIF3ejww3TlX6ZzbAmz0bi9kPPrPNWwvLuc3Vw0hMS462OGIiLQof5J+TyDP53m+d56vB4DrzCwfTy//R81YN2j+s3E3f/ssl5vO7EO2yjoiEgECNXpnMvBX51wGMBZ42cz83raZ3WJmOWaWU1hYGKCQjm5/pecirL7p7bjrIpV1RCQy+JOYtwOZPs8zvPN8fReYAeCc+xRIANL9XBfn3DPOuWznXHbnzp39j/44PDJnDQUl5fzmapV1RCRy+JP0FwP9zKyPmcXhOTE7u16bXOB8ADMbgCfpF3rbTTKzeDPrA/QDFgUq+GP1yYbdvPp5Lt/7Rh9G9FZZR0QiR5Ojd5xzNWZ2OzAXiAZecM6tMrOHgBzn3Gzgp8CzZvYTPCd1pzjnHLDKzGYAq4Ea4IfBHrlTWlHN3bOW07dzO36qso6IRBi/rkJyzs3Bc4LWd979PtOrgTMbWfdXwK+OI8aAemTOWnaUlPPGD84gIVZlHRGJLBF1G4aP1hfy2qJcvndWX0b0Tg12OCIirS5ikv6+imqmzlrOCZ3b8V8XnhTscEREgiJibjLzyD/W8NW+CmbdqrKOiESuiOjpf7i+kOmL87j57L4M66WyjohErjaf9A+WdU7s0p6fXKCyjohEtjZf3vnVu2vYua+CN287U2UdEYl4bbqnv2DdLl7PyeP755zA0MyUYIcjIhJ0bTbpl5RXM3XWCvp1ac+dF/QLdjgiIiGhzZZ3fvnuagr3V/Ln60cQH6OyjogItNGe/vy1u3hjST7fP7svp6qsIyJySJtL+iXl1Ux9czkndW3Pj1XWERE5Qpsr7zz87mp276/i2RuyVdYREamnTfX0P1i7k5lL8rn1nBMYkqGyjohIfW0m6ZeUeUbr9O+azI/OPzHY4YiIhKQ2U96prqvj1MwU7jivn8o6IiKNaDNJP719PM/ekB3sMEREQlqbKe+IiEjTlPRFRCKIkr6ISARR0hcRiSBK+iIiEURJX0Qkgijpi4hEECV9EZEIYs65YMdwBDMrBLYdxybSgd0BCieQFFfzKK7mUVzN0xbj6u2c69xUo5BL+sfLzHKccyF3aa7iah7F1TyKq3kiOS6Vd0REIoiSvohIBGmLSf+ZYAfQCMXVPIqreRRX80RsXG2upi8iIo1riz19ERFpRFgmfTMbY2brzGyjmU1tYHm8mb3uXf65mWWFSFxTzKzQzJZ6H99rpbheMLNdZraykeVmZk94415uZsNDJK5zzazEZ3/d30pxZZrZfDNbbWarzOzHDbRp9X3mZ1ytvs/MLMHMFpnZMm9cDzbQptU/k37GFZTPpPe1o83sSzN7t4FlLbe/nHNh9QCigU1AXyAOWAYMrNfmNuBp7/Qk4PUQiWsK8Mcg7LOzgeHAykaWjwX+CRgwGvg8ROI6F3g3CPurOzDcO50MrG/g37LV95mfcbX6PvPug/be6Vjgc2B0vTbB+Ez6E1dQPpPe1/4v4NWG/r1acn+FY09/FLDRObfZOVcFTAfG12szHnjROz0TON/MLATiCgrn3EfAnqM0GQ+85Dw+A1LMrHsIxBUUzrkdzrkvvNOlwBqgZ71mrb7P/Iyr1Xn3wX7v01jvo/7Jwlb/TPoZV1CYWQYwDniukSYttr/CMen3BPJ8nufz9f/4h9o452qAEiAtBOICmOAtB8w0s8wWjslf/sYeDKd7v57/08wGtfaLe79WD8PTS/QV1H12lLggCPvMW6pYCuwC5jnnGt1frfiZ9CcuCM5n8nfAz4G6Rpa32P4Kx6Qfzt4BspxzQ4B5HD6SS8O+wHNp+anAH4C3W/PFzaw9MAu40zm3rzVf+2iaiCso+8w5V+ucGwpkAKPM7JTWeN2m+BFXq38mzewSYJdzbklLv1ZDwjHpbwd8j8YZ3nkNtjGzGKAjUBTsuJxzRc65Su/T54ARLRyTv/zZp63OObfv4Ndz59wcINbM0lvjtc0sFk9ifcU592YDTYKyz5qKK5j7zPuaxcB8YEy9RcH4TDYZV5A+k2cCl5nZVjxl4PPM7G/12rTY/grHpL8Y6GdmfcwsDs9Jjtn12swGbvROXwV84LxnRIIZV72a72V4arKhYDZwg3dEymigxDm3I9hBmVm3g3VMMxuF5/9riycK72s+D6xxzv1fI81afZ/5E1cw9pmZdTazFO90InAhsLZes1b/TPoTVzA+k865e5xzGc65LDx54gPn3HX1mrXY/ooJxEZak3OuxsxuB+biGTHzgnNulZk9BOQ452bj+WC8bGYb8ZwonBQicd1hZpcBNd64prR0XABm9hqeUR3pZpYPTMNzUgvn3NPAHDyjUTYCZcB3QiSuq4BbzawGKAcmtcLBGzw9seuBFd56MMC9QC+f2IKxz/yJKxj7rDvwoplF4znIzHDOvRvsz6SfcQXlM9mQ1tpfuiJXRCSChGN5R0REjpGSvohIBFHSFxGJIEr6IiIRRElfRCSCKOmLiEQQJX0RkQiipC8iEkH+H3gYUqRcEh3SAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valiation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.多核卷积网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_4\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding_5 (Embedding)      (None, 300, 100)          300000    \n",
      "_________________________________________________________________\n",
      "reshape_1 (Reshape)          (None, 300, 100, 1)       0         \n",
      "_________________________________________________________________\n",
      "model (Model)                (None, 1, 1, 192)         76992     \n",
      "_________________________________________________________________\n",
      "flatten_4 (Flatten)          (None, 192)               0         \n",
      "_________________________________________________________________\n",
      "dense_8 (Dense)              (None, 10)                1930      \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 10)                0         \n",
      "_________________________________________________________________\n",
      "dense_9 (Dense)              (None, 1)                 11        \n",
      "=================================================================\n",
      "Total params: 378,933\n",
      "Trainable params: 378,933\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "filter_sizes=[3,4,5]\n",
    "def convolution():\n",
    "    inn = layers.Input(shape=(sequence_length, embedding_dimension, 1))\n",
    "    cnns = []\n",
    "    for size in filter_sizes:\n",
    "        conv = layers.Conv2D(filters=64, kernel_size=(size, embedding_dimension),\n",
    "                            strides=1, padding='valid', activation='relu')(inn)\n",
    "        pool = layers.MaxPool2D(pool_size=(sequence_length-size+1, 1), padding='valid')(conv)\n",
    "        cnns.append(pool)\n",
    "    outt = layers.concatenate(cnns)\n",
    "    \n",
    "    model = keras.Model(inputs=inn, outputs=outt)\n",
    "    return model\n",
    "\n",
    "def cnn_mulfilter():\n",
    "    model = keras.Sequential([\n",
    "        layers.Embedding(input_dim=num_features, output_dim=embedding_dimension,\n",
    "                        input_length=sequence_length),\n",
    "        layers.Reshape((sequence_length, embedding_dimension, 1)),\n",
    "        convolution(),\n",
    "        layers.Flatten(),\n",
    "        layers.Dense(10, activation='relu'),\n",
    "        layers.Dropout(0.2),\n",
    "        layers.Dense(1, activation='sigmoid')\n",
    "        \n",
    "    ])\n",
    "    model.compile(optimizer=keras.optimizers.Adam(),\n",
    "                 loss=keras.losses.BinaryCrossentropy(),\n",
    "                 metrics=['accuracy'])\n",
    "    return model\n",
    "\n",
    "model = cnn_mulfilter()\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 22500 samples, validate on 2500 samples\n",
      "Epoch 1/5\n",
      "22500/22500 [==============================] - 40s 2ms/sample - loss: 0.4740 - accuracy: 0.7557 - val_loss: 0.3136 - val_accuracy: 0.8724\n",
      "Epoch 2/5\n",
      "22500/22500 [==============================] - 40s 2ms/sample - loss: 0.2623 - accuracy: 0.8968 - val_loss: 0.2967 - val_accuracy: 0.8796\n",
      "Epoch 3/5\n",
      "22500/22500 [==============================] - 43s 2ms/sample - loss: 0.1840 - accuracy: 0.9350 - val_loss: 0.2893 - val_accuracy: 0.8868\n",
      "Epoch 4/5\n",
      "22500/22500 [==============================] - 40s 2ms/sample - loss: 0.1215 - accuracy: 0.9599 - val_loss: 0.3308 - val_accuracy: 0.8772\n",
      "Epoch 5/5\n",
      "22500/22500 [==============================] - 45s 2ms/sample - loss: 0.0694 - accuracy: 0.9806 - val_loss: 0.3699 - val_accuracy: 0.8848\n",
      "CPU times: user 10min 52s, sys: 4.88 s, total: 10min 56s\n",
      "Wall time: 3min 28s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = model.fit(x_train, y_train, batch_size=64, epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valiation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
